Repository navigation
fix(docker): pin pip, uv and certifi to reject the eMudhra chains - #239
Conversation
The Profiles IDE runs pip and uv at run time, and the bundled profiles-mcp server resolves packages from PyPI on every start. The current image trusts the compromised eMudhra chains in four places: pip 26.1.2, the unpinned uv 0.11.26 from the astral.sh install script, certifi 2025.04.26 in the profiles-mcp lock, and the Ubuntu CA store. - apt-get upgrade takes ca-certificates 20260816, which drops emSign. - pip 26.2.2 and certifi 2026.10.19 replace the plain pip upgrade. - uv 0.13.4 comes from its image by digest, so setup.sh skips its own install. uv keeps its bundled roots, which reject the chains, so its trust does not depend on the apt layer. - uv lock raises certifi in the profiles-mcp lock before setup.sh. Verify: in the built image, pip and uv fail TLS on an emSign test host and reach pypi.org; certifi is 2026.10.19 in both Pythons. Refs: SEC-707 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> 🔒 Scanned for secrets using gitleaks 8.30.1
There was a problem hiding this comment.
🔵 Needs a closer look
Security-sensitive trust changes need human confirmation of full-image builds and certificate-rejection behavior on both supported architectures.
No open issues 🎉
What changed in this PR
Updates the Profiles IDE image’s Python tooling and certificate trust to reject eMudhra chains, including the bundled profiles-mcp environment.
Changes:
- Upgrades Ubuntu packages and explicitly installs
ca-certificates. - Sets minimum pip and certifi versions and copies uv 0.13.4 from a digest-pinned image.
- Updates certifi in the profiles-mcp lockfile before setup so subsequent syncs retain the updated version.
| File | Description |
|---|---|
| Dockerfile | Updates system and Python trust dependencies and the profiles-mcp lockfile. |
Review effort: Balanced
Docker Preview Images ReadyPreview Docker images have been built for this PR: ECR (internal): docker pull 422074288268.dkr.ecr.us-east-1.amazonaws.com/rudderstack/profiles-code-server:pr-239Image Details:
Test the image: docker run --rm -p 8080:8080 422074288268.dkr.ecr.us-east-1.amazonaws.com/rudderstack/profiles-code-server:pr-239
|
certifi 2026.10.23 also drops the emSign C1 and C3 roots that 2026.10.19 restored. Verify: the pinned version reads 2026.10.23 and the lock resolves to it. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> 🔒 Scanned for secrets using gitleaks 8.30.1
Full-image builds pass on both architectures. Build and Release run 40095935809 on |
What changed
The Profiles IDE image now pins the TLS trust for Python tooling:
apt-get upgradeand an explicitca-certificatesinstall take Ubuntu's20260816ubuntu0.22.04.1store, which drops the emSign roots.pip>=26.2.2andcertifi>=2026.10.23replace the plainpip3 install --upgrade pip.ghcr.io/astral-sh/uvby index digest into/usr/local/bin. setup.sh finds it and skips its unpinnedastral.shinstall. uv keeps its bundled roots, so its trust does not depend on the apt layer.uv lock --upgrade-package 'certifi>=2026.10.23'raises certifi in the profiles-mcp v1.4.0 lock beforesetup.sh, souv syncanduv runinstart.shkeep it.Why
The IDE runs pip and uv at run time, and the bundled profiles-mcp server resolves
mcp[cli]from PyPI on every start. The current image trusts the compromised eMudhra intermediate chains in pip 26.1.2, uv 0.11.26, certifi 2025.04.26 (profiles-mcp venv) and the Ubuntu CA store. Ticket: SEC-707 (parent SEC-607).How to verify
The image was verified locally with the probe harness on a Mac mini. The build used the same base digest and the same apt, pip, uv and profiles-mcp steps as this Dockerfile (arm64). Results:
ca-certificates 20260816ubuntu0.22.04.1, pip 26.2.2, uv 0.13.4, certifi 2026.10.19 in the system Python and in the profiles-mcp.venv;ssland certifi reject the test hosts and reach a normal host;uv run --with "mcp[cli]"in the profiles-mcp project starts and keeps certifi 2026.10.19.The Dockerfile carries pins only. It has no build-time version checks.
Release path
This is a
fix:commit, so release-please opens the next patch release PR. Publishing that release runsbuild-docker.yaml, which pushesprofiles-code-server:v<version>to ECR. Then therudder:release-profiles-ide-infraflow bumpsRSOURCES_EXT_WHT_CODESERVERIMAGENAMEin rudderstack-operatoroperator-helm/valuefiles/values.sources.yaml(prod runs v1.20.3 today) and the image warmers in rudder-devopshelm-charts/cluster-overprovisioner/values.*.yaml(v1.20.2 today).Not covered
certifi 2026.10.23 also drops the emSign C1 and C3 roots. The pin skips the 7-day Dependabot cooldown because this is a security fix.
🤖 Generated with Claude Code